perm filename SQTILE.SAI[VIS,HPM]1 blob sn#419626 filedate 1979-02-19 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	ENTRY SQTILE
C00005 00003	INTERNAL PROCEDURE SQTILE(REFERENCE INTEGER PIC1 INTEGER YL1,XL1, TY,TX,YSQ,XSQ
C00008 00004	      BEGIN "write inner loop"
C00012 ENDMK
C⊗;
ENTRY SQTILE;
BEGIN "SQTILE"
REQUIRE "{}{}" DELIMITERS;

DEFINE PCLN=0;  comment index of word in a picture file containing
			number of scanlines in the picture;
DEFINE PCWD=1;	comment number of words in the picture;
DEFINE PCBY=2;	comment number of valid bytes in the picture;
DEFINE PCBYA=3;	comment no. of bytes including the nulls at the end of lines;
DEFINE LNWD=4;	comment no. of words per scanline;
DEFINE LNBY=5;	comment no. of valid bytes per scanline;
DEFINE LNBYA=6;	comment no. of bytes per scanline, including the nulls;
DEFINE WDBY=7;	comment no. of bytes per word;
DEFINE WDBI=8;	comment no. of bits containing data in a word;
DEFINE BYBI=9;	comment no. of bits per byte;
DEFINE BMAX=10;	comment largest value of a byte;
DEFINE BPTAB=11; comment address of second entry in byte pntr. table;
DEFINE LINTAB=12; comment actual address of the first entry in the row table;

DEFINE ILDB(A,B)={'134000000000 LOR (A LSH 23) LOR B};
DEFINE IDPB(A,B)={'136000000000 LOR (A LSH 23) LOR B};
DEFINE ADD(A,B)={'270000000000 LOR (A LSH 23) LOR B};
DEFINE ADDI(A,B)={'271000000000 LOR (A LSH 23) LOR B};
DEFINE IMULI(A,B)={'221000000000 LOR (A LSH 23) LOR B};
DEFINE IDIVI(A,B)={'231000000000 LOR (A LSH 23) LOR B};
DEFINE MOVE(A,B)={'200000000000 LOR (A LSH 23) LOR B};
DEFINE MOVEI(A,B)={'201000000000 LOR (A LSH 23) LOR B};
DEFINE MOVEM(A,B)={'202000000000 LOR (A LSH 23) LOR B};
DEFINE POPJ(A,B)={'263000000000 LOR (A LSH 23) LOR B};
DEFINE SOJG(A,B)={'367000000000 LOR (A LSH 23) LOR B};
INTERNAL PROCEDURE SQTILE(REFERENCE INTEGER PIC1; INTEGER YL1,XL1, TY,TX,YSQ,XSQ;
                          REFERENCE INTEGER PIC2; INTEGER YL2,XL2);
   BEGIN
   INTEGER PT1CI,PT2AI,FAC;
   comment
     copy a TY*YSQ by TX*XSQ window from PIC1 with upleft corner YL1,XL1 into
     a TY by TX window in PIC2 with upleft at YL2,XL2 each destination pixel
     is appropriately scaled sum of YSQ*XSQ source pixels;

   IF XL1<0 THEN BEGIN TX←TX+XL1%XSQ; XL2←XL2-XL1%XSQ; XL1←0; END;
   IF YL1<0 THEN BEGIN TY←TY+YL1%YSQ; YL2←YL2-YL1%YSQ; YL1←0; END;
   IF XL2<0 THEN BEGIN TX←TX+XL2; XL1←XL1-XL2*XSQ; XL2←0; END;
   IF YL2<0 THEN BEGIN TY←TY+YL2; YL1←YL1-YL2*YSQ; YL2←0; END;

   TX←(MEMORY[LOCATION(PIC1)+LNBY]-XL1)%XSQ MIN TX;  comment bounds test;
   TX←(MEMORY[LOCATION(PIC2)+LNBY]-XL2) MIN TX;
   TY←(MEMORY[LOCATION(PIC1)+PCLN]-YL1)%YSQ MIN TY;
   TY←(MEMORY[LOCATION(PIC2)+PCLN]-YL2) MIN TY;

   IF MEMORY[LOCATION(PIC2)+LNBY]≤0 ∨ MEMORY[LOCATION(PIC2)+PCLN]≤0 ∨
      TX<1 ∨ TY<1 ∨ XSQ<1 ∨ YSQ<1 THEN RETURN;

   PT1CI←MEMORY[MEMORY[LOCATION(PIC1)+BPTAB]+XL1-1]
          +MEMORY[LOCATION(PIC1)+LINTAB+YL1]; comment source byte pointer;

   PT2AI←MEMORY[MEMORY[LOCATION(PIC2)+BPTAB]+XL2-1]
          +MEMORY[LOCATION(PIC2)+LINTAB+YL2]; comment destination byte pointer;

   FAC←
   IF MEMORY[LOCATION(PIC2)+BMAX]<MEMORY[LOCATION(PIC1)+BMAX]*XSQ*YSQ THEN
      (MEMORY[LOCATION(PIC1)+BMAX]*XSQ*YSQ) % MEMORY[LOCATION(PIC2)+BMAX] ELSE
      - MEMORY[LOCATION(PIC2)+BMAX] % (MEMORY[LOCATION(PIC1)+BMAX]*XSQ*YSQ) ;
   IF FAC>0 ∧ (MEMORY[LOCATION(PIC1)+BMAX]*XSQ*YSQ)%FAC >
               MEMORY[LOCATION(PIC2)+BMAX] THEN FAC←FAC+1;
   IF ABS(FAC)=1 THEN FAC←0; 
   comment do samples have to be multiplied or divided to scale properly?;

      BEGIN "write inner loop"

      DEFINE SUM=1, OVR=2, PT1=3, PT1A=4, PT1C=5, LPX=6, LPY=7,
             PT2='10, PT2A='11, PT1B='13;

      INTEGER LPYB,LPXB,I,J,CP;
      INTEGER ARRAY CODE[1:(XSQ*2+2)*YSQ+14];

      CP←0;
      CODE[CP←CP+1]←       MOVE(PT1C,LOCATION(PT1CI));
      CODE[CP←CP+1]←       MOVE(PT2A,LOCATION(PT2AI));
      CODE[CP←CP+1]←       MOVEI(LPY,TY);
		      LPYB←                                LOCATION(CODE[CP+1]);
      CODE[CP←CP+1]←       MOVE(PT1A,PT1C);
      CODE[CP←CP+1]←       ADDI(PT1C,MEMORY[LOCATION(PIC1)+LNWD]*YSQ);
      CODE[CP←CP+1]←       MOVE(PT2,PT2A);
      CODE[CP←CP+1]←       ADDI(PT2A,MEMORY[LOCATION(PIC2)+LNWD]);
      CODE[CP←CP+1]←       MOVEI(LPX,TX);

		      LPXB←                                LOCATION(CODE[CP+1]);
      FOR I←1 STEP 1 UNTIL YSQ DO
	 BEGIN
	 CODE[CP←CP+1]←MOVEM(PT1A,PT1);
	 FOR J←1 STEP 1 UNTIL XSQ DO
	    BEGIN
	    IF I=1 ∧ J=1 THEN CODE[CP←CP+1]← ILDB(SUM,PT1)
	    ELSE BEGIN CODE[CP←CP+1]←ILDB(0,PT1); CODE[CP←CP+1]←ADD(SUM,0); END;
	    IF I=1 ∧ J=XSQ THEN CODE[CP←CP+1]←MOVEM(PT1,PT1B);
	    END;
	 IF I≠YSQ THEN CODE[CP←CP+1]←ADDI(PT1A,MEMORY[LOCATION(PIC1)+LNWD]);
	 END;

      IF FAC≠0 THEN CODE[CP←CP+1]← IF FAC<0 THEN IMULI(SUM,-FAC) ELSE IDIVI(SUM,FAC);
      CODE[CP←CP+1]←       IDPB(SUM,PT2);
      CODE[CP←CP+1]←       MOVE(PT1A,PT1B);
      CODE[CP←CP+1]←       SOJG(LPX,LPXB);
      CODE[CP←CP+1]←       SOJG(LPY,LPYB);
      CODE[CP←CP+1]←       POPJ('17,0);

      START_CODE PUSHJ '17,ACCESS(CODE[1]); END;

      END;
   END;
END "SQTILE";